Peak index in a mountain array

Time: O(LogN); Space: O(1); easy

Let’s call an array arr a mountain if the following properties hold:

  • arr.length >= 3

  • There exists some i with 0 < i < arr.length - 1 such that:

    • arr[0] < arr[1] < … arr[i-1] < arr[i]

    • arr[i] > arr[i+1] > … > arr[arr.length - 1]

Given an integer array arr that is guaranteed to be a mountain, return any i such that arr[0] < arr[1] < … arr[i - 1] < arr[i] > arr[i + 1] > … > arr[arr.length - 1].

Example 1:

Input: A = [0,1,0]

Output: 1

Example 2:

Input: A = [0,2,1,0]

Output: 1

Example 3:

Input: A = [0,10,5,2]

Output: 1

Example 4:

Input: A = [3,4,5,1]

Output: 2

Example 5:

Input: A = [24,69,100,99,79,78,67,36,26,19]

Output: 2

Constraints:

  • 3 <= len(arr) <= 104

  • 0 <= arr[i] <= 106

  • arr is guaranteed to be a mountain array.

1. Binary Search [O(LogN), O(1)]

[1]:
class Solution1(object):
    """
    Time: O(LogN)
    Space: O(1)
    """
    def peakIndexInMountainArray(self, A):
        """
        :type A: List[int]
        :rtype: int
        """
        left, right = 0, len(A)

        while left < right:
            mid = left + (right-left) // 2
            if A[mid] > A[mid+1]:
                right = mid
            else:
                left = mid + 1

        return left
[2]:
s = Solution1()

A = [0,1,0]
assert s.peakIndexInMountainArray(A) == 1

A = [0,2,1,0]
assert s.peakIndexInMountainArray(A) == 1

A = [0,10,5,2]
assert s.peakIndexInMountainArray(A) == 1

A = [3,4,5,1]
assert s.peakIndexInMountainArray(A) == 2

A = [24,69,100,99,79,78,67,36,26,19]
assert s.peakIndexInMountainArray(A) == 2